﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using CREAPA.Dominio;
using CREAPA.UL.Web.Models;
using CREAPA.RepositorioADO;
using System.Web.Security;
using System.Security.Principal;
using System.Net.Mail;
using System.IO;
using System.Data.SqlClient;
using Npgsql;
using System.Data;
using CrystalDecisions.CrystalReports.Engine;

namespace CREAPA.UL.Web.Controllers
{
    public class PortariaController : Controller
    {
        private siscreaEntitiesBD db = new siscreaEntitiesBD();
        PortariaRepositorioADO portariaADO = new PortariaRepositorioADO();
        SituacaoPortariaRepositorioADO sitPortariaADO = new SituacaoPortariaRepositorioADO();

        [Authorize]
        public ActionResult Index()
        {
            string usu = User.Identity.Name;
            var listaPendente = portariaADO.ListarPortariasPendente(usu);
            ViewBag.listaPendente = listaPendente;
            var listaTramite = portariaADO.ListarPortariaEmTramite(usu);
            ViewBag.listaTramite = listaTramite;
            var ListaImprimir = portariaADO.ListarPortariasImprimir(usu);
            ViewBag.ListaImprimir = ListaImprimir;
            return View();
        }

        [Authorize]
        public ActionResult Cadastrar()
        {
            string usu = User.Identity.Name;
            var permissao = new SelectList(db.FuncionarioPermissoes.Where(p => p.Login == usu && (p.Permissao == 14 || p.Permissao == 11)));
            if (permissao.Count() > 0)
            {
                var model = new CREAPA.Dominio.Portaria();
                model.DataPortaria = DateTime.Now.ToString().Substring(0,10);
                ViewBag.IdTipoPortaria = new SelectList(db.TipoPortarias.OrderBy(p => p.Descricao), "Id", "Descricao");
                ViewBag.IdAssuntoPortaria = new SelectList(db.AssuntoPortarias.OrderBy(p => p.Descricao), "Id", "Descricao");
                model.Descricao = "<p style=\"text-align:justify\">Considerando   </p><p style=\"text-align:justify\">&nbsp;</p><p style=\"text-align:justify\">&nbsp;</p><p style=\"text-align:justify\">RESOLVE:</p>";
                return View(model);
            }
            else
            {
                TempData["notice"] = "Você não tem permissão para acessar essa página. É necessária a permissão: 0014";
                return RedirectToAction("../Os/Erro");
            }
        }

        [HttpPost]
        [ValidateInput(false)]
        [ValidateAntiForgeryToken]
        public ActionResult Cadastrar(CREAPA.Dominio.Portaria portaria)
        {
            if (portaria.IdTipoPortaria == null)
                ModelState.AddModelError("IdTipoPortaria","Selecione o Tipo");
            if (portaria.IdAssuntoPortaria == null)
                ModelState.AddModelError("IdAssuntoPortaria", "Selecione o Assunto");

            if (ModelState.IsValid)
            {
                try
                {
                    string usu = User.Identity.Name;
                    portaria.PessoaCadastrou = usu;
                    portaria.Ano = DateTime.Now.Year;
                    string idPortaria=portariaADO.Inserir(portaria);
                    portaria.Id = int.Parse(idPortaria);
                    EnviarEmailPortaria(portaria, "1");
                    TempData["CadastrarPortaria"] = "Portaria Gravada com sucesso";
                    return RedirectToAction("Index");
                }
                catch (Exception ex)
                {
                    ViewBag.IdTipoPortaria = new SelectList(db.TipoPortarias.OrderBy(p => p.Descricao), "Id", "Descricao");
                    ViewBag.IdAssuntoPortaria = new SelectList(db.AssuntoPortarias.OrderBy(p => p.Descricao), "Id", "Descricao");
                    TempData["notice"] = ex;
                    ModelState.AddModelError("", "Não foi possível gravar as alterações, tente novamente mais tarde, se o problema persistir, contate o administrador do sistema. \nErro: " + ex.Message);
                }
            }
            else
            {
                ViewBag.IdTipoPortaria = new SelectList(db.TipoPortarias.OrderBy(p => p.Descricao), "Id", "Descricao");
                ViewBag.IdAssuntoPortaria = new SelectList(db.AssuntoPortarias.OrderBy(p => p.Descricao), "Id", "Descricao");
            }
            return View(portaria);
        }


        [Authorize]
        public ActionResult ListaPendentes()
        {
            string usu = User.Identity.Name;
            FuncionarioRepositorioADO funcADO = new FuncionarioRepositorioADO();
            CREAPA.Dominio.Funcionario funcionario = new CREAPA.Dominio.Funcionario();
            funcionario = funcADO.ListarPorLogin(usu);
            int setor_id = Convert.ToInt32(funcionario.Setor);

            var ListaDePortaria = portariaADO.ListarPortariasPend(usu);
            int qtde_os_pend_analise = ListaDePortaria.Count();
            ViewBag.TotalPortaria = qtde_os_pend_analise;
            return View(ListaDePortaria);
        }

        [Authorize]
        public ActionResult Erro()
        {
            return View();
        }

        [Authorize]
        public ActionResult Analisar(string Id)
        {
            //if ((DateTime.Now.Hour > 7) && (DateTime.Now.Hour < 17))//Bloqueia Analisar Portaria fora do horário do expediente
            //{
                var portaria = portariaADO.ListarPorId(Id);

                ViewBag.IdTipoPortaria = new SelectList(db.TipoPortarias.OrderBy(p => p.Descricao), "Id", "Descricao", portaria.IdTipoPortaria);
                ViewBag.IdAssuntoPortaria = new SelectList(db.AssuntoPortarias.OrderBy(p => p.Descricao), "Id", "Descricao", portaria.IdAssuntoPortaria);

                //Retorna o histórico da Situação da Portaria
                var ListaDePortaria = sitPortariaADO.ListarPorIdDescricao(portaria.Id);
                ViewBag.ListaPortaria = ListaDePortaria;

                return View(portaria);
            //}
            //else
            //{
            //    TempData["notice"] = "Não é possível Analisar Portaria fora do horario do expediente";
            //    return RedirectToAction("Erro");
            //}

        }

        [HttpPost]
        [ValidateInput(false)]
        [ValidateAntiForgeryToken]
        public ActionResult Analisar(CREAPA.Dominio.Portaria portaria)
        {
            if (ModelState.IsValid)
            {

                portaria.PresidenteAssinou = User.Identity.Name;
                portaria.Ano = DateTime.Now.Year;
                portaria.PessoaCadastrou = User.Identity.Name;
                string numeroPortaria = portariaADO.Analisar(portaria);
                portaria.Numero = numeroPortaria;//
                EnviarEmailPortaria(portaria, null);
                TempData["AnalisePortaria"] = "Portaria Gravada com sucesso";

                if (portaria.Analisado_Superintendencia == true && portaria.PendenciaCadastro==false)
                    return RedirectToAction("Detalhes", new { id = portaria.Id });
                else
                    return RedirectToAction("ListaPendentes");
            }
            else
            {
                ViewBag.IdTipoPortaria = new SelectList(db.TipoPortarias.OrderBy(p => p.Descricao), "Id", "Descricao", portaria.IdTipoPortaria);
                ViewBag.IdAssuntoPortaria = new SelectList(db.AssuntoPortarias.OrderBy(p => p.Descricao), "Id", "Descricao", portaria.IdAssuntoPortaria);
                //Retorna o histórico da Situação da Portaria
                var ListaDePortaria = sitPortariaADO.ListarPorIdDescricao(portaria.Id);
                ViewBag.ListaPortaria = ListaDePortaria;
            }

            return View(portaria);
        }

        [Authorize]
        public ActionResult Alterar(string Id)
        {
            //if ((DateTime.Now.Hour > 7) && (DateTime.Now.Hour < 17))//Bloqueia Analisar Portaria fora do horário do expediente
            //{
                var portaria = portariaADO.ListarPorId(Id);
                ViewBag.IdTipoPortaria = new SelectList(db.TipoPortarias.OrderBy(p => p.Descricao), "Id", "Descricao", portaria.IdTipoPortaria);
                ViewBag.IdAssuntoPortaria = new SelectList(db.AssuntoPortarias.OrderBy(p => p.Descricao), "Id", "Descricao", portaria.IdAssuntoPortaria);

                //Retorna o histórico da Situação da Portaria
                var ListaDePortaria = sitPortariaADO.ListarPorIdDescricao(portaria.Id);
                ViewBag.ListaPortaria = ListaDePortaria;
                if (portaria.PendenciaCadastro == true)
                    return View(portaria);
                else
                {
                    TempData["notice"] = "Esta Portaria não possui pendências para alteração.";
                    return RedirectToAction("../Os/Erro");
                }
            //}
            //else
            //{
            //    TempData["notice"] = "Não é possível Alterar Portaria fora do horario do expediente";
            //    return RedirectToAction("../Os/Erro");
            //}

        }

        [HttpPost]
        [ValidateInput(false)]
        [ValidateAntiForgeryToken]
        public ActionResult Alterar(CREAPA.Dominio.Portaria portaria)
        {
            if (ModelState.IsValid)
            {
                portaria.PessoaCadastrou = User.Identity.Name;
                portaria.Ano = DateTime.Now.Year;
                portariaADO.Salvar(portaria);
                EnviarEmailPortaria(portaria, "1");
                TempData["AlterarPortaria"] = "Portaria Alterada com sucesso";
                return RedirectToAction("Index");
            }
            else
            {
                //Retorna o histórico da Situação da Portaria
                var ListaDePortaria = sitPortariaADO.ListarPorIdDescricao(portaria.Id);
                ViewBag.ListaPortaria = ListaDePortaria;
            }

            return View(portaria);
        }



        [Authorize]
        public ActionResult Detalhes(string Id)
        {
            var portaria = portariaADO.ListarDescPorId(Id);

            ViewBag.PessoaCadastrou = new SelectList(db.Funcionarios, "Login", "Login", portaria.PessoaCadastrou);
            ViewBag.Descricao = portaria.Descricao;

            //Retorna o histórico da Situação da Portaria
            var ListaDePortaria = sitPortariaADO.ListarPorIdDescricao(portaria.Id);
            ViewBag.ListaPortaria = ListaDePortaria;

            return View(portaria);

        }

        [Authorize]
        public ActionResult Imprimir(string id)
        {
            var portaria = portariaADO.ListarImprimir(id);
            ViewBag.Descricao = portaria.Descricao;
            if (portaria == null)
                return HttpNotFound();
            if (portaria.Analisado_Presidencia == true)
                return View(portaria);
            else
            {
                TempData["notice"] = "Você só pode imprimir esta Portaria após a analise da Presidencia.";
                return RedirectToAction("../Os/Erro");
            }
        }


        [Authorize]
        public ActionResult Excluir(string Id)
        {
            var portaria = portariaADO.ListarDescPorId(Id);
            ViewBag.Descricao = portaria.Descricao;

            //Retorna o histórico da Situação da Os
            var ListaDePortaria = sitPortariaADO.ListarPorIdDescricao(portaria.Id);
            ViewBag.ListaPortaria = ListaDePortaria;

            return View(portaria);
        }

        [HttpPost, ActionName("Excluir")]
        [ValidateAntiForgeryToken]
        public ActionResult ExcluirConfirmado(string Id)
        {
            try
            {
                var portaria = portariaADO.ListarDescPorId(Id);
                ViewBag.Descricao = portaria.Descricao;

                //Retorna o histórico da Situação da Os
                var ListaDePortaria = sitPortariaADO.ListarPorIdDescricao(portaria.Id);

                ViewBag.ListaPortaria = ListaDePortaria;
                portariaADO.Excluir(portaria.Id);
                TempData["ExcluirPortaria"] = "Portaria Excluida com sucesso";
                return RedirectToAction("ListaPendentes");
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("", "Não foi possível gravar as alterações, tente novamente mais tarde, se o problema persistir, contate o administrador do sistema. <BR />Erro: " + ex.Message);
            }
            return View();
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }

        private void EnviarEmailPortaria(CREAPA.Dominio.Portaria portaria , string tipo)
        {
            //Instancia o objeto
            MailMessage Email = new MailMessage();

            //Atribui ao método From o valor do Remetente 
            Email.From = new MailAddress("<creapainformatica@gmail.com>", "CREA-PA");

            //Define o formato da mensagem (pode ser texto)
            Email.IsBodyHtml = true;

            Email.BodyEncoding = System.Text.Encoding.GetEncoding("iso-8859-1");

            if (tipo=="1")//Cadastro da Portaria (envia email para todos os funcionários da superintendência)
            {
                //Atribui ao método To o valor do Destinatário
                Email.To.Add(RelacaoEmailSetor(16));//Envia email para todos os funcionários ativos da SUPERINTENDÊNCIA 16

                //Subject ou assunto da mensagem
                Email.Subject = "Cadastro de Portaria gravada em " + DateTime.Now.ToString();

                //Atribui ao método corpo o texto da mensagem

                Email.Body = "<html><body><font style='font-family: Verdana; font-size: small'>Prezado(a) " +
                " <br /><br /> Informamos que encontra-se pendente de análise da SUPERINTENDÊNCIA a Portaria referente a Requisição nº " + portaria.Id + " com os seguintes dados:" +
                 "<br />Funcionário: " + portaria.PessoaCadastrou +
                "<br />Descrição: " + portaria.Descricao +                    
                "<br /><br />Por favor, entre no SiSCREA e atenda a Portaria o mais breve possível." +
                "<br /><br />Esta é uma mensagem enviada automaticamente pelo SISCREA." +
                "<br /><br />Atenciosamente,<br /><br /><br />Núcleo de Tecnologia da Informação do CREA-PA.<br/><br/> " +
                "Telefone:(91)3219-1155/1156 </body></html>";
            }//Superintendência Analisou sem pendência.Envia email para todos os funcionários ativos da PRESIDÊNCIA
            else if (portaria.Analisado_Superintendencia == false && portaria.PendenciaCadastro == false)
            {
                var pessoaCadastrou = new SelectList(db.SituacaoPortarias.Where(p => p.IdPortaria == portaria.Id && p.IdTipoSituacao == 1), "PessoaCadastrou", "PessoaCadastrou", portaria.Id).First();
                portaria.PessoaCadastrou = pessoaCadastrou.Value;
                //Atribui ao método To o valor do Destinatário
                Email.To.Add(RelacaoEmailSetor(68));//Envia email para todos os funcionários ativos da PRESIDÊNCIA 68

                //Subject ou assunto da mensagem
                Email.Subject = "Portaria Pendente de Análise gravada em " + DateTime.Now.ToString();

                //Atribui ao método corpo o texto da mensagem

                Email.Body = "<html><body><font style='font-family: Verdana; font-size: small'>Prezado(a) " +
                " <br /><br /> Informamos que encontra-se pendente de análise da PRESIDÊNCIA a Portaria referente a Requisição nº " + portaria.Id + " com os seguintes dados:" +
                "<br />Funcionário: " + portaria.PessoaCadastrou +
               "<br />Descrição: " + portaria.Descricao +
               "<br /><br />Por favor, entre no SiSCREA e atenda a Portaria o mais breve possível." +
               "<br /><br />Esta é uma mensagem enviada automaticamente pelo SISCREA." +
               "<br /><br />Atenciosamente,<br /><br /><br />Núcleo de Tecnologia da Informação do CREA-PA.<br/><br/> " +
               "Telefone:(91)3219-1155/1156 </body></html>";
            }
            else if (portaria.PendenciaCadastro == true)//Pendência enviada para correção do profissioanal
            {
                CREAPA.Dominio.Portaria portariaTemp = new CREAPA.Dominio.Portaria();
                portariaTemp = portariaADO.EmailFuncPortaria(portaria.Id);

                //Atribui ao método To o valor do Destinatário
                Email.To.Add(portariaTemp.PessoaCadastrou);//email da pessoa que cadastrou

                //Subject ou assunto da mensagem
                Email.Subject = "Pendência na Portaria gravada em " + DateTime.Now.ToString();

                //Atribui ao método corpo o texto da mensagem

                Email.Body = "<html><body><font style='font-family: Verdana; font-size: small'>Prezado(a) " + /*funcionario.Pessoa.Nome +*/ "" +
           " <br /><br /> Informamos que foi adicionada uma observação em sua Portaria referente a Requisição nº " + portaria.Id +
           " <br />Descrição: " + portaria.Descricao +
           "<br /><br />Por favor, entre no SiSCREA e corrija sua Portaria." +
           "<br /><br />Esta é uma mensagem enviada automaticamente pelo SISCREA." +
           "<br /><br />Atenciosamente,<br /><br /><br />Núcleo de Tecnologia da Informação do CREA-PA.<br/><br/> " +
           "Telefone:((91)3219-1155/1156 </body></html>";
            }
            else if (portaria.Analisado_Superintendencia == true && portaria.PendenciaCadastro == false)//Portaria Concluída
            {
                CREAPA.Dominio.Portaria portariaTemp = new CREAPA.Dominio.Portaria();
                portariaTemp = portariaADO.EmailFuncPortaria(portaria.Id);

                //Atribui ao método To o valor do Destinatário
                Email.To.Add(portariaTemp.PessoaCadastrou);//email da pessoa que cadastrou

                Email.Bcc.Add(RelacaoEmailSetor(16));//Envia cópia do email para todos os funcionários ativos da SUPERINTENDÊNCIA 16
                
                //Subject ou assunto da mensagem
                Email.Subject = "Portaria n°"+ portaria.Numero+" Concluída em " + DateTime.Now.ToString();

                //Atribui ao método corpo o texto da mensagem

                Email.Body = "<html><body><font style='font-family: Verdana; font-size: small'>Prezado(a) " + /*funcionario.Pessoa.Nome +*/ "" +
           " <br /><br /> Informamos que sua Portaria referente a Requisição nº " + portaria.Id + " foi concluída, gerando a Portaria N° "+ portaria.Numero+ " para a solicitação: " + portaria.Descricao +
           "<br /><br />Se desejar, entre no SiSCREA e imprima sua Portaria." +
          "<br /><br />Esta é uma mensagem enviada automaticamente pelo SISCREA." +
           "<br /><br />Atenciosamente,<br /><br /><br />Núcleo de Tecnologia da Informação do CREA-PA.<br/><br/> " +
           "Telefone:((91)3219-1155/1156 </body></html>";
            }

            //Define a prioridade do Email como Alta
            Email.Priority = MailPriority.High;

            //cria objeto com portaria dados do SMTP 
            SmtpClient smtp = new SmtpClient();

            //Define o host do SMTP 
            smtp.Host = "smtp.gmail.com";
            //smtp.Host = "192.168.0.3";
            smtp.Port = 587;
            smtp.UseDefaultCredentials = false;
            smtp.Credentials = new System.Net.NetworkCredential
            ("creapainformatica@gmail.com", "ReS@3)41934");// Enter seders User name and password
            smtp.EnableSsl = true;

            try
            {
                //envia o e-mail através do método .send() 
                smtp.Send(Email);
            }
            catch (Exception erro)
            {
                //Envia a mensagem de erro

            }
            //Exclui o objeto de e-mail da memória 
            Email.Dispose();

        }
        //Monta a lista de email separado por vírgulas dos funcionários ativos do setor
        protected string RelacaoEmailSetor(int setor)
        {
            string listaEmail = "";

            FuncionarioSetorRepositorioADO funcionarioADO = new FuncionarioSetorRepositorioADO();

            List<CREAPA.Dominio.FuncionarioSetor> listaFunc;

            listaFunc = funcionarioADO.ListarEmailsFuncionarioSetor(setor);

            for (int i = 0; i < (listaFunc.Count()); i++)
            {
                CREAPA.Dominio.FuncionarioSetor func = (CREAPA.Dominio.FuncionarioSetor)listaFunc[i];

                if (i == 0)//Primeiro email
                    listaEmail = listaEmail + listaFunc[i].Login;
                else//a partir do segundo email
                    listaEmail = listaEmail + "," + listaFunc[i].Login;
            }
            return listaEmail;
        }

        public ActionResult ImprimirPortaria(int id)
        {
            ReportADO report = new ReportADO();

            if (ValidarEntrada(id))
            {
                DataTable dt = report.GetPortaria(id);

                ReportClass rptH = new ReportClass();

                rptH.FileName = Server.MapPath("~/Reports/Portaria.rpt");
                rptH.Load();
                rptH.SetDataSource(dt);
                
                Stream stream = rptH.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat);

                rptH.Close();
                rptH.Dispose();
                
                return File(stream, "application/pdf");
            }
            else
            {
                TempData["notice"] = "Parâmetros incorretos. Tente novamente.";
                return RedirectToAction("../OS/Erro");
            }
        }

        private bool ValidarEntrada(int id)
        {
            var portaria = portariaADO.ListarPorId(id.ToString());
            try
            {
                if (portaria.Numero==null || portaria.Numero=="")
                    return false;
            }
            catch (Exception ex)
            {
                return false;
            }
            return true;
        }

        [Authorize]
        public ActionResult Pesquisar()
        {
            string usu = User.Identity.Name;
            var permissao = new SelectList(db.FuncionarioPermissoes.Where(p => p.Login == usu && (p.Permissao == 15 || p.Permissao == 11)));
            if (permissao.Count() > 0)
            {
                var model = new CREAPA.Dominio.Portaria();
                
                ViewBag.IdTipoPortaria = new SelectList(db.TipoPortarias.OrderBy(p => p.Descricao), "Id", "Descricao", "Selecione");
                ViewBag.IdAssuntoPortaria = new SelectList(db.AssuntoPortarias.OrderBy(p => p.Descricao), "Id", "Descricao", "Selecione");
                var ListaDePortaria = portariaADO.ListarPortariasPesquisa(model);
                //TempData para aux na exibição da msg Nenhum resultado encontrado
                TempData["aux"] = "";
                ViewBag.ListaDePortaria = ListaDePortaria;
                return View();
            }
            else
            {
                TempData["notice"] = "Você não tem permissão para acessar essa página. É necessária a permissão: 0015";
                return RedirectToAction("../Os/Erro");
            }

        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Pesquisar(CREAPA.Dominio.Portaria portaria)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    ViewBag.IdTipoPortaria = new SelectList(db.TipoPortarias.OrderBy(p => p.Descricao), "Id", "Descricao", portaria.IdTipoPortaria);
                    ViewBag.IdAssuntoPortaria = new SelectList(db.AssuntoPortarias.OrderBy(p => p.Descricao), "Id", "Descricao", portaria.IdAssuntoPortaria);

                    var ListaDePortaria = portariaADO.ListarPortariasPesquisa(portaria);
                    ViewBag.ListaDePortaria = ListaDePortaria;
                    //TempData para aux na exibição da msg Nenhum resultado encontrado
                    if (ViewBag.ListaDePortaria.Count == 0)
                    {
                        TempData["aux"] = "vazio";
                    }
                    return View();
                }
                catch (Exception ex)
                {
                    ViewBag.IdTipoPortaria = new SelectList(db.TipoPortarias.OrderBy(p => p.Descricao), "Id", "Descricao", portaria.IdTipoPortaria);
                    ViewBag.IdAssuntoPortaria = new SelectList(db.AssuntoPortarias.OrderBy(p => p.Descricao), "Id", "Descricao", portaria.IdAssuntoPortaria);

                    TempData["notice"] = ex;
                    ModelState.AddModelError("", "Não foi possível gravar as alterações, tente novamente mais tarde, se o problema persistir, contate o administrador do sistema." + Environment.NewLine + "Erro: " + ex.Message);
                }
            }
            else
            {
                ViewBag.IdTipoPortaria = new SelectList(db.TipoPortarias.OrderBy(p => p.Descricao), "Id", "Descricao", portaria.IdTipoPortaria);
                ViewBag.IdAssuntoPortaria = new SelectList(db.AssuntoPortarias.OrderBy(p => p.Descricao), "Id", "Descricao", portaria.IdAssuntoPortaria);

            }
            return View(portaria);

        }

    }
}






